const express = require('express'); //npm i express
// 解决请求跨域问题的插件
const cors = require('cors');// npm i cors
// 请求体转化插件
const bodyParser = require('body-parser');// npm i body-parser

const app = express();

const port = 3000;

app.use(cors());//解决跨域访问问题

//注册请求体转换中间件
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//引用 mongoose , 启动mongodb服务命令：管理员运行 net start mongodb
const mongoose = require('mongoose');// npm i mongoose

mongoose.connect('mongodb://localhost/todo-list');//连接school数据库
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
    console.log('MongoDB 连接成功！ ')
});

const todoSchema = mongoose.Schema({ //创建todo的Schema，说明每个字段是什么类型
    title: String,
    content: String
});
const Todo = mongoose.model('todo', todoSchema);//创建表模型Todo

app.post('/create-todo', (req, res) => {
    console.log('req.body', req.body);
    let todo = req.body;
    Todo.create(todo, (err) => {
        if (err) {
            console.error(err);
            return res.send({
                code: 0,
                msg: err.message
            });
        }
    })
    res.send({
        code: 1,
        msg: '创建成功！'
    });
});

// 获取备忘录列表
app.post('/getTodoList',async (req,res) => {
    // 1.服务器接受到请求，获取请求体（请求参数对象），赋值给params参数
    let params = req.body;
    // console.log(params);
    let where = {};   // 2. 声明查询条件，空对象即可
    // 3. 判断前端是否传了search字段
    if (params && params.search) {
        //如果传了search字段，查询条件增加title字段的查询，&regex实现模糊查询
       // where['title'] = {$regex: params.search};
        // {title: {$regex: '标题'}} 模糊查询例子

        //加分项：标题、内容两个字段同时模糊查询
        //$or : 数组中的任何一个查询条件成立，都会作为结果返回
        where['$or'] = [
            { title :  {$regex: params.search } }, // 第一个查询条件：标题
            { content: {$regex: params.search } }  // 第二个查询条件：内容
        ];
    }
    // 预设一个值
    let page = {
         size: 1000000,
        current: 1
    }
    
    if (params && params.pageInfo) {
        page = params.pageInfo;
    }

     try {
         //4. 查库，find方法中放查询条件的对象where
         // 此时where是{}或者{title: {$regex:params.search}}或者{$or:[{},{}]}
        //  console.log('where',where);
        console.log(page)
         let result = await Todo.find(where)
            .limit(page.size).skip(page.size*(page.current - 1))//skip跳过条数
         let total = await Todo.count(where);
        // 5.响应查出的结果
          res.send({ result, total });
     } 
     catch {
         //如果查询报错
         res.send({ msg: '暂无数据'});
     }
     //  console.log('result: ', result);
});

// 根据 _id删除数据
app.post('/deleteTodo', async (req,res) => {
    // 获取 _id的值
     let todoId = req.body.todoId;
     console.log('todoId',todoId);

     if(todoId){
         // 当前端传入todoId有值时才执行删除
         Todo.remove({_id: todoId} , (err) => {
           if(err){
              return res.send({ code: 0, msg: err.message });
           }
           res.send({ code: 1, msg: '删除成功！'});
         });
         return
     }
     // 当前没有传todoId， 返回错误信息
     res.send({ code: 0, msg: '没有_id, 无法删除' });
});

// 根据_id修改备忘录
app.post('/updateTodo', async (req, res) => {
    let editTodo = req.body; // 接收前端传来的参数
    let updateData = {
        $set: {
            title: editTodo.title,
            content: editTodo.content
        }
    }
    try {
        //执行修改业务
        let result = await Todo.findByIdAndUpdate(editTodo.id, updateData);
        if (!result) { // 如果没有查到要修改的数据
            return res.send({ code: 0, msg: '修改失败!' });
        }
        res.send({ code: 1, msg: '修改成功!' }) // 修改成功
    }
    catch (err) {
        // 修改过程中报错
        res.send({ code: 0, msg: err.message });
    }

});

app.listen(port, () => {
    console.log('备忘录服务器已启动，监听端口：', port);
});